package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.constant.order.OrderPurchaseProcessTypeEnum;
import com.ssy.lingxi.common.constant.order.OrderTradeProcessTypeEnum;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.model.bo.*;
import com.ssy.lingxi.order.model.vo.basic.request.OrderSeparateVO;
import com.ssy.lingxi.order.model.vo.basic.response.OrderPayTypeDetailVO;
import com.ssy.lingxi.order.model.vo.common.request.OrderProductPriceTypeVO;
import com.ssy.lingxi.order.model.vo.common.response.OrderProductProcessQueryVO;

import java.util.List;
import java.util.Map;

/**
 * 流程规则配置、会员支付策略、会员支付参数查询接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-30
 */
public interface IBaseOrderProcessService {
    /**
     * 校验采购订单（多供应商）合并下单条件
     * @param separateVO 接口参数
     * @return 校验结果
     */
    Wrapper<Void> checkOrderMergeCondition(OrderSeparateVO separateVO);

    /**
     * （批量）查询供应商交易流程配置
     * @param shopId 商城Id
     * @param tradeProcessTypeEnum 交易流程类型
     * @param vendorProducts 供应会员及商品信息列表
     * @return 查询结果
     */
    List<TradeProcessDetailBO> findVendorTradeProcessByProducts(Long shopId, OrderTradeProcessTypeEnum tradeProcessTypeEnum, List<VendorProductBO> vendorProducts);

    /**
     * 查询（供应）会员交易流程配置
     * @param shopId 商城Id
     * @param tradeProcessTypeEnum 交易流程类型
     * @param vendorProducts 供应会员及商品信息列表
     * @return 查询结果
     */
    Wrapper<OrderTradeProcessBO> findVendorTradeProcess(Long shopId, OrderTradeProcessTypeEnum tradeProcessTypeEnum, List<VendorProductBO> vendorProducts);

    /**
     * 查询（供应）会员交易流程配置
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @param shopId          商城Id
     * @param tradeProcessTypeEnum 交易流程类型
     * @param products       采购商品列表
     * @return 查询结果
     */
    Wrapper<OrderTradeProcessBO> findVendorTradeProcess(Long vendorMemberId, Long vendorRoleId, Long shopId, OrderTradeProcessTypeEnum tradeProcessTypeEnum, List<OrderProductBO> products);

    /**
     * (转单）检查并返回查询会员交易流程配置
     * @param vendorProducts 订单Id、商城Id及供应会员、供应会员商品列表
     * @return 查询结果
     */
    Wrapper<Map<Long, OrderTradeProcessBO>> findVendorTradeProcess(List<OrderShopProductBO> vendorProducts);

    /**
     * 查询（采购）会员采购流程配置
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param purchaseProcessTypeEnum 采购流程类型
     * @param contractIds 合同Id列表
     * @return 查询结果
     */
    Wrapper<OrderPurchaseProcessBO> findBuyerPurchaseProcess(Long buyerMemberId, Long buyerRoleId, OrderPurchaseProcessTypeEnum purchaseProcessTypeEnum, List<Long> contractIds);

    /**
     * （批量）从平台后台的会员支付策略中，查询会员支付方式、支付渠道设置
     * @param vendors 供应会员Id与角色Id列表
     * @return 查询结果
     */
    Wrapper<List<PlatformPaymentDetailBO>> findPlatformMemberPayment(List<VendorBO> vendors);

    /**
     * 从平台后台的会员支付策略中，查询会员支付方式、支付渠道设置
     * @param memberId 供应会员Id
     * @param roleId   供应会员角色Id
     * @return 查询结果
     */
    List<PlatformPayTypeBO> findPlatformMemberPayment(Long memberId, Long roleId);

    /**
     * 从平台后台的会员支付策略中，查询会员支付方式、支付渠道设置，拼接结算支付
     * @param buyerMemberId  采购会员Id
     * @param buyerMemberRoleId 采购会员角色Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @param needCheckSettlementPayType 是否从资金账户服务中查询结算账户配置
     * @return 查询结果
     */
    List<PlatformPayTypeBO> findPlatformMemberPayment(Long buyerMemberId, Long buyerMemberRoleId, Long vendorMemberId, Long vendorRoleId, boolean needCheckSettlementPayType);

    /**
     * 从平台后台的会员支付策略中，查询指定的支付渠道设置
     * @param payChannel 支付渠道
     * @param memberId 会员Id
     * @param roleId 会员角色Id
     * @return 查询结果
     */
    Wrapper<PlatformPayTypeBO> findPlatformMemberPayment(Integer payChannel, Long memberId, Long roleId);

    /**
     * 从平台后台的会员支付策略中，（批量）查询会员支付方式、支付渠道设置
     * @param vendors 供应会员列表
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> findMemberPayment(Long buyerMemberId, Long buyerRoleId, List<VendorBO> vendors);

    /**
     * 从平台后台的会员支付策略中，查询会员支付方式、支付渠道设置
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> findMemberPayment(Long vendorMemberId, Long vendorRoleId);

    /**
     * 从平台后台的会员支付策略、与结算服务中，查询会员支付方式、支付渠道设置
     * @param buyerMemberId  采购会员Id
     * @param buyerRoleId    采购会员角色Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> findMemberPayment(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId);

    /**
     * （拆单）批量查询、校验供应商支付方式及渠道配置
     * @param vendors 供应商列表
     * @return 查询结果
     */
    Wrapper<Map<VendorBO, List<OrderPayTypeDetailVO>>> checkMemberPayments(List<VendorBO> vendors);

    /**
     * 查询支付参数
     * @param payChannel 支付渠道
     * @param memberId 会员Id
     * @param roleId 会员角色Id
     * @return 支付参数
     */
    Wrapper<OrderPaymentParameterDetailBO> findOrderPaymentParameters(Integer payChannel, Long memberId, Long roleId);

    /**
     * 查询支付参数（直接查询平台支付参数设置）
     * @param payChannel 支付渠道
     * @return 支付参数
     */
    Wrapper<OrderPaymentParameterDetailBO> findPlatformPaymentParameters(Integer payChannel);

    /**
     * 查询支付参数（直接查询会员支付参数设置）
     * @param payChannel 支付渠道
     * @param memberId 会员Id
     * @param roleId 会员角色Id
     * @return 支付参数
     */
    Wrapper<OrderPaymentParameterDetailBO> findMemberPaymentParameters(Integer payChannel, Long memberId, Long roleId);

    /**
     * 商品能力 - 上架指引查询商品是否配置了交易流程
     * @param memberId （供应商）会员Id
     * @param roleId    （供应商）会员角色Id
     * @param shopIds   商城Id列表
     * @param shopType  商城类型
     * @param products  商品Id、SkuId、价格类型列表
     * @return 没有配置交易流程的商品Id、SkuId、价格类型列表
     */
    Wrapper<List<OrderProductProcessQueryVO>> findProductProcess(Long memberId, Long roleId, List<Long> shopIds, Integer shopType, List<OrderProductPriceTypeVO> products);
}
